package com.harvey.metrics.metric.meter;

import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.harvey.metrics.metric.BaseExample;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

/**
 * @author harvey
 * @Description <p>
 * Metric 度量，衡量。
 * </p>
 * @date 2020-04-01 13:23
 * @since
 */

public class MeterExample extends BaseExample {

    /**
     * 1. 要使用Metric，必须要有一个Metric的注册表
     */
    private final static MetricRegistry metricRegistry = new MetricRegistry();

    /**2. 为Metric注册表按照name, 去指定一个Meter对象【度量器对象】*/
    private final static Meter request_meter = metricRegistry.meter("tqs");

    /**2. 为Metric注册表按照name, 去指定一个Meter对象【度量器对象】*/
    private final static Meter data_meter = metricRegistry.meter("dataBufferColumn");

    public static void main(String[] args) {

        // 3. 将度量结果输出到控制台的 报告器
        ConsoleReporter consoleReporter = ConsoleReporter.forRegistry(metricRegistry)
                .convertRatesTo(TimeUnit.MINUTES)
                .convertDurationsTo(TimeUnit.MINUTES)
                .build();

        // 4. 按照指定的周期 去轮询调用一次 注册表中Meter对象的统计信息
        consoleReporter.start(10, TimeUnit.SECONDS);

        for (; ; ) {
            networkAccess();
            processAction(new byte[ThreadLocalRandom.current().nextInt(1000)]);
        }
    }

    /**
     * 模拟网络请求
     */
    private static void networkAccess() {
        randomSleep();
    }

    /**
     * 模拟处理过程
     */
    private static void processAction(byte[] data) {

        // 5. 通过指定的度量器 去标记事件的发生。用于统计请求的相关度量参数
        request_meter.mark();
        // 通过指定的度量器 去计算请求数据的大小，最后统计输出
        data_meter.mark(data.length);
        randomSleep();
    }



}
